﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;



namespace Anuntiomatic.Server
{
    public partial class SysMenuPage : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {                
                grvSysMenu_LoadData();
                LoadComboSource();
            }
        }

        void grvSysMenu_LoadData()
        {
            grvSysMenu.DataSource = SysMenu.GetAll();
            grvSysMenu.DataBind();
        }

        void LoadComboSource()
        {
            ddlParentID.Items.Clear();
            foreach (var item in SysMenu.GetAll())
            {
                ddlParentID.Items.Add(new ListItem(item.MenuName.ShowNameLevel(item.Level), item.MenuID.ToString()));
            }
            ddlParentID.Items.Insert(0, new ListItem("----------",""));
        }

        protected void grvSysMenu_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int MenuID = Convert.ToInt32(e.CommandArgument);
                hdfObjectId.Value = MenuID.ToString();
                switch (e.CommandName)
                {
                    case "AddChild":
                        hdfObjectId.Value = "0";
                        SysMenu childObj = new SysMenu();
                        txtMenuName.Text = "";
                        ddlParentID.SelectedValue = MenuID.ToString();
                        txtDescription.Text = "";
                        txtOrd.Text = "";
                        RegisterStartUpScript("OpenDialog('dialog-form',400);");
                        break;
                    case "Editing":
                        SysMenu obj = DB.SysMenus.FirstOrDefault(p => p.MenuID == MenuID);
                        if (obj != null)
                        {
                            hdfObjectId.Value = obj.MenuID.ToString();
                            txtMenuName.Text = obj.MenuName;
                            ddlParentID.SelectedValue = obj.ParentID is int ? obj.ParentID.Value.ToString() : "";
                            txtLink.Text = obj.Link;
                            txtDescription.Text = obj.Description;
                            txtOrd.Text = obj.Ord != null ? obj.Ord.ToString() : "";
                        }
                        RegisterStartUpScript("OpenDialog('dialog-form',400);");
                        break;
                    case "Deleting":
                        Authorize(Role.Write);
                        SysMenu deletedObj = DB.SysMenus.FirstOrDefault(p => p.MenuID == MenuID);
                        if (deletedObj != null)
                        {
                            DB.SysMenus.DeleteOnSubmit(deletedObj);
                            DB.SubmitChanges();
                            //Insert change log
                            InsertChangeLog("Xóa thông tin menu");
                        }
                        SysMenu.ReloadData();
                        grvSysMenu_LoadData();
                        break;
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("conflicted with the REFERENCE constraint"))
                {
                    ShowMessageBox("Không toàn vẹn dữ liệu. Bạn không thể xóa.");
                }
                else
                {
                    HandleException(ex);
                }
            }
        }

        protected void lbtnAddNew_Click(object sender, EventArgs e)
        {
            try
            {
                ControlClass.ResetControlValues(dialogPanel);
                hdfObjectId.Value = "0";
                RegisterStartUpScript("OpenDialog('dialog-form',400);");
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        protected void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                Authorize(Role.Write);
                int id = 0;
                int.TryParse(hdfObjectId.Value, out id);
                SysMenu obj;
                if (hdfObjectId.Value == "0")
                    obj = new SysMenu();
                else
                    obj = DB.SysMenus.FirstOrDefault(p => p.MenuID == id);
                obj.MenuCode = txtMenuName.Text.Trim().NameToTag();
                obj.MenuName = txtMenuName.Text.Trim();
                int parentID = 0;
                int.TryParse(ddlParentID.SelectedValue.Trim(), out parentID);
                obj.ParentID = parentID > 0 ? parentID : (int?)null;
                obj.Link = txtLink.Text.Trim();
                obj.Description = txtDescription.Text.Trim();
                int ord = 0;
                int.TryParse(txtOrd.Text.Trim(), out ord);
                obj.Ord = ord;
                if (obj.Ord == 0) obj.Ord = 1; // Riêng menu do có cơ chế triger tự cập nhật level nên nếu gán mặc định = 0 sẽ lỗi
                // Lỗi: Menu vừa thêm mới sẽ có mã = menuCha+00000, menu chua của menu vừa thêm sẽ tự động nhảy level thành level+00001
                obj.Disabled = false;

                if (ValidateInfo(obj))
                {
                    if (hdfObjectId.Value == "0")
                    {
                        DB.SysMenus.InsertOnSubmit(obj);
                    }
                    DB.SubmitChanges();
                    //Insert change log
                    InsertChangeLog(hdfObjectId.Value == "0" ? "Thêm mới menu" : "Cập nhật thông tin menu");
                    SysMenu.ReloadData();
                    grvSysMenu_LoadData();
                    LoadComboSource();
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        protected override bool ValidateInfo(object obj)
        {
            string errMsg = string.Empty;
            SysMenu obj1 = (SysMenu)obj;
            if (obj1.ParentID == obj1.MenuID)
            {
                errMsg += "Không thể là cha của chính nó.\\n";
            }
            if (string.IsNullOrWhiteSpace(obj1.MenuCode))
            {
                errMsg += "Bắt buộc nhập Mã.\\n";
            }
            else
            {
                SysMenu obj2 = SysMenu.GetAll().FirstOrDefault(p => p.MenuID != obj1.MenuID && p.MenuCode.ToUpper() == obj1.MenuCode.ToUpper());
                if (obj2 != null)
                {
                    errMsg += "Mã đã tồn tại. Hãy nhập mã khác.\\n";
                }
            }
            if (string.IsNullOrWhiteSpace(obj1.MenuName))
            {
                errMsg += "Bắt buộc nhập Tên.\\n";
            }
            if (errMsg.Length > 0)
            {
                RegisterStartUpScript(string.Format("OpenDialog('dialog-form',400); alert('{0}');", errMsg));
                return false;
            }
            return true;
        }
    }
}